package com.tangyuan.common.entity;

import com.tangyuan.common.enums.ResultCode;
import lombok.Data;

/**
 * @描述:
 * @Author: TangYuan
 * @Date: 2024/11/15 17:35
 */
@Data
public class Result<T> {
    
    /** 状态码 */
    private int code;
    /** 返回信息 */
    private String message;
    /** 返回数据 */
    private T data;
    
    // 构造方法
    public Result(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    
    /**
     * 成功返回
     * @return {@link Result<T>}
     */
    public static <T> Result<T> success() {
        return new Result<>(
                ResultCode.SUCCESS.getCode(),
                ResultCode.SUCCESS.getMessage(),
                null
        );
    }
    
    /**
     * 成功返回
     * @param data 返回参数
     * @return {@link Result<T>}
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(
                ResultCode.SUCCESS.getCode(),
                ResultCode.SUCCESS.getMessage(),
                data
        );
    }
    
    /**
     * 错误返回
     * @return {@link Result<T>}
     */
    public static <T> Result<T> fail() {
        return new Result<>(
                ResultCode.INTERNAL_SERVER_ERROR.getCode(),
                ResultCode.INTERNAL_SERVER_ERROR.getMessage(),
                null
        );
    }
    
    /**
     *  错误返回
     * @param message 返回错误信息
     * @return {@link Result<T>}
     */
    public static <T> Result<T> fail(String message) {
        return new Result<>(
                ResultCode.INTERNAL_SERVER_ERROR.getCode(),
                message,
                null
        );
    }
    
    /**
     * 错误返回
     * @param resultCode 返回Enum
     * @return {@link Result<T>}
     */
    public static <T> Result<T> fail(ResultCode resultCode) {
        return new Result<>(
                resultCode.getCode(),
                resultCode.getMessage(),
                null
        );
    }
    
    /**
     * 错误返回
     * @param resultCode 状态码
     * @param message    返回错误信息
     * @return {@link Result<T>}
     */
    public static <T> Result<T> fail(ResultCode resultCode, String message) {
        return new Result<>(
                resultCode.getCode(),
                message,
                null
        );
    }
}
